+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
+Sun May 5 16:42:32 2002 Kristian Rietveld <kris@gtk.org>
+
+ The "big treeview focus patch". Fixes several issues and adds some
+ goodies. Related bugs: #73676, #73734, #78660.
+
+ * gtk/gtktreeview.h: add gtk_tree_view_set_cursor_on_cell
+
+ * gtk/gtktreeview.c (gtk_tree_view_button_press): focus on a cell
+ if applicable,
+ (gtk_tree_view_bin_expose): set_cell_data before iterating columns,
+ add support for row-spanning focus rectangles,
+ (gtk_tree_view_has_special_cell): new function,
+ (gtk_tree_view_move_cursor_left_right): add support for multiple
+ focusable cells in one column,
+ (gtk_tree_view_set_cursor): call _set_cursor_on_cell now,
+ (gtk_tree_view_set_cursor_on_cell): copy of _set_cursor, extended
+ with focus_cell parameter,
+ (gtk_tree_view_search_iter): removed unused column variable,
+ (gtk_tree_view_start_editing): add neighbor size code to allow
+ for multiple editable cells in one column.
+
+ * gtk/gtktreeviewcolumn.c (_GtkTreeViewColumnCellInfo): add
+ in_editing_mode field,
+ (gtk_tree_view_column_get_edited_cell): new function, removed
+ _get_editable_cell,
+ (_gtk_tree_view_column_get_cell_at_pos): new function,
+ (gtk_tree_view_column_pack_end): s/g_new/g_new0/ ...,
+ (gtk_tree_view_column_cell_process_action): loads of changes to get
+ it right and to allow for multiple special cells, etc,
+ (gtk_tree_view_column_cell_first): new function,
+ (gtk_tree_view_column_cell_last): ditto,
+ (gtk_tree_view_column_cell_next): ditto,
+ (gtk_tree_view_column_cell_prev): ditto,
+ (gtk_tree_view_column_cell_focus): add left and right parameters,
+ allow for multiple special cells,
+ (gtk_tree_view_column_cell_is_visible): add assertion,
+ (gtk_tree_view_column_focus_cell): new function,
+ (gtk_tree_view_column_stop_editing): unset in_editing_mode flag,
+ (_gtk_tree_view_column_get_neighbor_sizes): iterate through cells
+ correctly
+
+ * gtk/gtktreeviewcolumn.h: add gtk_tree_view_column_focus_cell
+
+ * gtk/gtktreeprivate.h: s/_get_editable_cell/_get_edited_cell/, add
+ _gtk_tree_view_column_get_cell_at_pos, add new parameters to
+ _gtk_tree_view_column_cell_focus.
+
+ * tests/testtreeedit.c: add some cells in order to test new code.
+
Sun May 5 02:22:59 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/test-images/*: image files for testing pixbuf loaders
GtkTreeViewColumn *column);
gboolean _gtk_tree_view_column_has_editable_cell (GtkTreeViewColumn *column);
-GtkCellRenderer *_gtk_tree_view_column_get_editable_cell (GtkTreeViewColumn *column);
+GtkCellRenderer *_gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn *column);
gint _gtk_tree_view_column_count_special_cells (GtkTreeViewColumn *column);
+GtkCellRenderer *_gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column,
+ gint x);
GtkTreeSelection* _gtk_tree_selection_new (void);
GtkTreeSelection* _gtk_tree_selection_new_with_tree_view (GtkTreeView *tree_view);
GdkRectangle *expose_area,
guint flags);
gboolean _gtk_tree_view_column_cell_focus (GtkTreeViewColumn *tree_column,
- gint direction);
+ gint direction,
+ gboolean left,
+ gboolean right);
void _gtk_tree_view_column_cell_draw_focus (GtkTreeViewColumn *tree_column,
GdkWindow *window,
GdkRectangle *background_area,
GtkTreePath *path,
gboolean clear_and_select,
gboolean clamp_node);
+static gboolean gtk_tree_view_has_special_cell (GtkTreeView *tree_view);
/* interactive search */
static void gtk_tree_view_search_dialog_destroy (GtkWidget *search_dialog,
gint dval;
gint pre_val, aft_val;
GtkTreeViewColumn *column = NULL;
+ GtkCellRenderer *focus_cell = NULL;
gint column_handled_click = FALSE;
gboolean emit_row_activated = FALSE;
GdkRectangle area;
area = cell_area;
- _gtk_tree_view_column_get_neighbor_sizes (column, _gtk_tree_view_column_get_editable_cell (column), &left, &right);
+ _gtk_tree_view_column_get_neighbor_sizes (column, _gtk_tree_view_column_get_edited_cell (column), &left, &right);
area.x += left;
area.width -= right + left;
pre_val = tree_view->priv->vadjustment->value;
tree_view->priv->focus_column = column;
+ focus_cell = _gtk_tree_view_column_get_cell_at_pos (column, event->x - background_area.x);
+ if (focus_cell)
+ gtk_tree_view_column_focus_cell (column, focus_cell);
+
if (event->state & GDK_CONTROL_MASK)
{
gtk_tree_view_real_set_cursor (tree_view, path, FALSE, TRUE);
GList *last_column;
gint vertical_separator;
gint horizontal_separator;
+ gint focus_line_width;
gboolean allow_rules;
+ gboolean has_special_cell;
g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
"horizontal_separator", &horizontal_separator,
"vertical_separator", &vertical_separator,
"allow_rules", &allow_rules,
+ "focus-line-width", &focus_line_width,
NULL);
if (tree_view->priv->tree == NULL)
parity = _gtk_rbtree_node_find_parity (tree, node);
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ GtkTreeViewColumn *column = list->data;
+ gtk_tree_view_column_cell_set_cell_data (column,
+ tree_view->priv->model,
+ &iter,
+ GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
+ node->children?TRUE:FALSE);
+ }
+
+ has_special_cell = gtk_tree_view_has_special_cell (tree_view);
+
for (list = tree_view->priv->columns; list; list = list->next)
{
GtkTreeViewColumn *column = list->data;
else
flags &= ~GTK_CELL_RENDERER_SORTED;
- gtk_tree_view_column_cell_set_cell_data (column,
- tree_view->priv->model,
- &iter,
- GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT),
- node->children?TRUE:FALSE);
-
-
background_area.x = cell_offset;
background_area.width = column->width;
&event->area,
flags);
}
- if (node == cursor &&
+ if (node == cursor && has_special_cell &&
((column == tree_view->priv->focus_column &&
GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS) &&
GTK_WIDGET_HAS_FOCUS (widget)) ||
}
}
+ /* draw the big row-spanning focus rectangle, if needed */
+ if (!has_special_cell && node == cursor &&
+ GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS) &&
+ GTK_WIDGET_HAS_FOCUS (widget))
+ {
+ gint width;
+ GtkStateType focus_rect_state;
+
+ focus_rect_state =
+ flags & GTK_CELL_RENDERER_SELECTED ? GTK_STATE_SELECTED :
+ (flags & GTK_CELL_RENDERER_PRELIT ? GTK_STATE_PRELIGHT :
+ (flags & GTK_CELL_RENDERER_INSENSITIVE ? GTK_STATE_INSENSITIVE :
+ GTK_STATE_NORMAL));
+
+ gdk_drawable_get_size (tree_view->priv->bin_window,
+ &width, NULL);
+ gtk_paint_focus (widget->style,
+ tree_view->priv->bin_window,
+ focus_rect_state,
+ NULL,
+ widget,
+ "treeview",
+ 0,
+ BACKGROUND_FIRST_PIXEL (tree_view, tree, node),
+ width,
+ MAX (BACKGROUND_HEIGHT (node),
+ tree_view->priv->expander_size));
+ }
+
y_offset += max_height;
if (node->children)
{
}
}
+/* Returns TRUE if the treeview contains no "special" (editable or activatable)
+ * cells. If so we draw one big row-spanning focus rectangle.
+ */
+static gboolean
+gtk_tree_view_has_special_cell (GtkTreeView *tree_view)
+{
+ GList *list;
+
+ for (list = tree_view->priv->columns; list; list = list->next)
+ {
+ if (!((GtkTreeViewColumn *)list->data)->visible)
+ continue;
+ if (_gtk_tree_view_column_count_special_cells (list->data))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/* Returns TRUE if the focus is within the headers, after the focus operation is
* done
*/
&iter,
GTK_RBNODE_FLAG_SET (cursor_node, GTK_RBNODE_IS_PARENT),
cursor_node->children?TRUE:FALSE);
- if (_gtk_tree_view_column_cell_focus (column, count))
+ if (_gtk_tree_view_column_cell_focus (column, count,
+ list->prev?TRUE:FALSE,
+ list->next?TRUE:FALSE))
{
tree_view->priv->focus_column = column;
found_column = TRUE;
if (found_column)
{
- _gtk_tree_view_queue_draw_node (tree_view,
- cursor_tree,
- cursor_node,
- NULL);
+ if (!gtk_tree_view_has_special_cell (tree_view))
+ _gtk_tree_view_queue_draw_node (tree_view,
+ cursor_tree,
+ cursor_node,
+ NULL);
g_signal_emit (G_OBJECT (tree_view), tree_view_signals[CURSOR_CHANGED], 0);
}
gtk_tree_view_clamp_column_visible (tree_view, tree_view->priv->focus_column);
GtkTreePath *path,
GtkTreeViewColumn *focus_column,
gboolean start_editing)
+{
+ gtk_tree_view_set_cursor_on_cell (tree_view, path, focus_column,
+ NULL, start_editing);
+}
+
+/**
+ * gtk_tree_view_set_cursor_on_cell:
+ * @tree_view: A #GtkTreeView
+ * @path: A #GtkTreePath
+ * @focus_column: A #GtkTreeViewColumn, or %NULL
+ * @focus_cell: A #GtkCellRenderer, or %NULL
+ * @start_editing: %TRUE if the specified cell should start being edited.
+ *
+ * Sets the current keyboard focus to be at @path, and selects it. This is
+ * useful when you want to focus the user's attention on a particular row. If
+ * @focus_column is not %NULL, then focus is given to the column specified by
+ * it. If @focus_column and @focus_cell are not %NULL, and @focus_column
+ * contains 2 or more editable or activatable cells, then focus is given to
+ * the cell specified by @focus_cell. Additionally, if @focus_column is
+ * specified, and @start_editing is %TRUE, then editing should be started in
+ * the specified cell. This function is often followed by
+ * @gtk_widget_grab_focus (@tree_view) in order to give keyboard focus to the
+ * widget. Please note that editing can only happen when the widget is
+ * realized.
+ **/
+void
+gtk_tree_view_set_cursor_on_cell (GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *focus_column,
+ GtkCellRenderer *focus_cell,
+ gboolean start_editing)
{
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
g_return_if_fail (path != NULL);
if (focus_column)
g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (focus_column));
+ if (focus_cell)
+ {
+ g_return_if_fail (focus_column);
+ g_return_if_fail (GTK_IS_CELL_RENDERER (focus_cell));
+ }
gtk_tree_view_real_set_cursor (tree_view, path, TRUE, TRUE);
}
g_return_if_fail (column_in_tree);
tree_view->priv->focus_column = focus_column;
+ if (focus_cell)
+ gtk_tree_view_column_focus_cell (focus_column, focus_cell);
if (start_editing)
gtk_tree_view_start_editing (tree_view, path);
}
}
-
/**
* gtk_tree_view_get_bin_window:
* @tree_view: A #GtkTreeView
GtkTreePath *path;
GtkTreeView *tree_view = gtk_tree_selection_get_tree_view (selection);
- GtkTreeViewColumn *column =
- gtk_tree_view_get_column (tree_view, tree_view->priv->search_column);
path = gtk_tree_model_get_path (model, iter);
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
retval = TRUE;
if (editable_widget != NULL)
{
+ gint left, right;
+ GdkRectangle area;
+ GtkCellRenderer *cell;
+
+ area = cell_area;
+ cell = _gtk_tree_view_column_get_edited_cell (tree_view->priv->focus_column);
+ _gtk_tree_view_column_get_neighbor_sizes (tree_view->priv->focus_column, cell, &left, &right);
+
+ area.x += left;
+ area.width -= right + left;
+
gtk_tree_view_real_start_editing (tree_view,
tree_view->priv->focus_column,
cursor_path,
editable_widget,
- &cell_area,
+ &area,
NULL,
flags);
}
GtkTreePath *path,
GtkTreeViewColumn *focus_column,
gboolean start_editing);
+void gtk_tree_view_set_cursor_on_cell (GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *focus_column,
+ GtkCellRenderer *focus_cell,
+ gboolean start_editing);
void gtk_tree_view_get_cursor (GtkTreeView *tree_view,
GtkTreePath **path,
GtkTreeViewColumn **focus_column);
guint expand : 1;
guint pack : 1;
guint has_focus : 1;
+ guint in_editing_mode : 1;
};
/* Type methods */
static GtkTreeViewColumnCellInfo *gtk_tree_view_column_get_cell_info (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell_renderer);
+/* cell list manipulation */
+static GList *gtk_tree_view_column_cell_first (GtkTreeViewColumn *tree_column);
+static GList *gtk_tree_view_column_cell_last (GtkTreeViewColumn *tree_column);
+static GList *gtk_tree_view_column_cell_next (GtkTreeViewColumn *tree_column,
+ GList *current);
+static GList *gtk_tree_view_column_cell_prev (GtkTreeViewColumn *tree_column,
+ GList *current);
static GtkObjectClass *parent_class = NULL;
return FALSE;
}
+/* gets cell being edited */
GtkCellRenderer *
-_gtk_tree_view_column_get_editable_cell (GtkTreeViewColumn *column)
+_gtk_tree_view_column_get_edited_cell (GtkTreeViewColumn *column)
{
GList *list;
for (list = column->cell_list; list; list = list->next)
- if (((GtkTreeViewColumnCellInfo *)list->data)->cell->mode ==
- GTK_CELL_RENDERER_MODE_EDITABLE)
+ if (((GtkTreeViewColumnCellInfo *)list->data)->in_editing_mode)
return ((GtkTreeViewColumnCellInfo *)list->data)->cell;
return NULL;
return i;
}
+GtkCellRenderer *
+_gtk_tree_view_column_get_cell_at_pos (GtkTreeViewColumn *column,
+ gint x)
+{
+ GList *list;
+ gint current_x = 0;
+
+ list = gtk_tree_view_column_cell_first (column);
+ for (; list; list = gtk_tree_view_column_cell_next (column, list))
+ {
+ GtkTreeViewColumnCellInfo *cellinfo = list->data;
+ if (current_x <= x && x <= current_x + cellinfo->real_width)
+ return cellinfo->cell;
+ current_x += cellinfo->real_width;
+ }
+
+ return NULL;
+}
+
/* Public Functions */
g_object_ref (G_OBJECT (cell));
gtk_object_sink (GTK_OBJECT (cell));
- cell_info = g_new (GtkTreeViewColumnCellInfo, 1);
+ cell_info = g_new0 (GtkTreeViewColumnCellInfo, 1);
cell_info->cell = cell;
cell_info->expand = expand ? TRUE : FALSE;
cell_info->pack = GTK_PACK_END;
gint min_x, min_y, max_x, max_y;
gint focus_line_width;
gint dx;
+ gint special_cells;
min_x = G_MAXINT;
min_y = G_MAXINT;
max_x = 0;
max_y = 0;
- real_cell_area = *cell_area;
- real_background_area = *background_area;
- dx = real_cell_area.x - real_background_area.x;
+ special_cells = _gtk_tree_view_column_count_special_cells (tree_column);
+
+ if (special_cells > 1 && action == CELL_ACTION_FOCUS)
+ {
+ GtkTreeViewColumnCellInfo *info = NULL;
+ gboolean found_has_focus = FALSE;
+
+ /* one should have focus */
+ for (list = tree_column->cell_list; list; list = list->next)
+ {
+ info = list->data;
+ if (info && info->has_focus)
+ {
+ found_has_focus = TRUE;
+ break;
+ }
+ }
+
+ if (!found_has_focus)
+ {
+ /* give the first one focus */
+ info = gtk_tree_view_column_cell_first (tree_column)->data;
+ info->has_focus = TRUE;
+ }
+ }
gtk_widget_style_get (GTK_WIDGET (tree_column->tree_view),
"focus-line-width", &focus_line_width,
NULL);
- /* Find out how my extra space we have to allocate */
+
+ real_cell_area = *cell_area;
+ real_background_area = *background_area;
+ dx = real_cell_area.x - real_background_area.x - focus_line_width;
+
+ real_cell_area.x += focus_line_width;
+
+ /* Find out how many extra space we have to allocate */
for (list = tree_column->cell_list; list; list = list->next)
{
- GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data;
+ GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *)list->data;
if (! info->cell->visible)
continue;
full_requested_width += info->requested_width;
}
- extra_space = cell_area->width - full_requested_width;
+ extra_space = background_area->width - full_requested_width;
if (extra_space < 0)
extra_space = 0;
+ else if (extra_space > 0 && expand_cell_count > 0)
+ extra_space /= expand_cell_count;
+ /* iterate list for GTK_PACK_START cells */
for (list = tree_column->cell_list; list; list = list->next)
{
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data;
if (! info->cell->visible)
continue;
- real_cell_area.width = info->requested_width +
+ real_background_area.width = info->requested_width +
(info->expand?extra_space:0);
- info->real_width = real_cell_area.width;
- real_cell_area.x += focus_line_width;
+ info->real_width = real_background_area.width;
- real_background_area.width = real_cell_area.width;
- real_background_area.x += focus_line_width;
- if (!list->prev)
- real_background_area.width += dx;
+ real_cell_area.width = real_background_area.width;
+ real_cell_area.width -= 2 * focus_line_width;
if (action == CELL_ACTION_RENDER)
{
&x_offset, &y_offset,
&width, &height);
- if (min_x > (real_cell_area.x + x_offset))
- min_x = real_cell_area.x + x_offset;
- if (max_x < real_cell_area.x + x_offset + width)
- max_x = real_cell_area.x + x_offset + width;
- if (min_y > (real_cell_area.y + y_offset))
- min_y = real_cell_area.y + y_offset;
- if (max_y < real_cell_area.y + y_offset + height)
- max_y = real_cell_area.y + y_offset + height;
+ if (special_cells > 1)
+ {
+ if (info->has_focus)
+ {
+ min_x = real_cell_area.x + x_offset;
+ max_x = min_x + width;
+ min_y = real_cell_area.y + y_offset;
+ max_y = min_y + height;
+ }
+ }
+ else
+ {
+ if (min_x > (real_cell_area.x + x_offset))
+ min_x = real_cell_area.x + x_offset;
+ if (max_x < real_cell_area.x + x_offset + width)
+ max_x = real_cell_area.x + x_offset + width;
+ if (min_y > (real_cell_area.y + y_offset))
+ min_y = real_cell_area.y + y_offset;
+ if (max_y < real_cell_area.y + y_offset + height)
+ max_y = real_cell_area.y + y_offset + height;
+ }
}
else if (action == CELL_ACTION_EVENT)
{
if (event)
{
- if (_gtk_tree_view_column_count_special_cells (tree_column) == 1)
+ if (special_cells == 1)
{
- /* only 1 activatably cell -> whole column can activate */
+ /* only 1 activatable cell -> whole column can activate */
if (cell_area->x <= ((GdkEventButton *)event)->x &&
cell_area->x + cell_area->width > ((GdkEventButton *)event)->x)
try_event = TRUE;
*/
try_event = TRUE;
}
- else /* if (info->has_focus)*/
- /* FIXME 73676: allow focusing individual cells */
- {
- try_event = TRUE;
- }
+ else if (special_cells > 1 && info->has_focus)
+ try_event = TRUE;
+ else if (special_cells == 1)
+ try_event = TRUE;
+
if (try_event)
{
gboolean visible, mode;
if (*editable_widget != NULL)
{
g_return_val_if_fail (GTK_IS_CELL_EDITABLE (*editable_widget), FALSE);
+ info->in_editing_mode = TRUE;
+ gtk_tree_view_column_focus_cell (tree_column, info->cell);
return TRUE;
}
}
}
}
- real_cell_area.x += (info->requested_width + tree_column->spacing);
- real_background_area.x += (info->requested_width + tree_column->spacing);
+
+ real_cell_area.x += (info->real_width + tree_column->spacing);
+ real_background_area.x += (info->real_width + tree_column->spacing);
}
+
+ /* iterate list for PACK_END cells */
for (list = g_list_last (tree_column->cell_list); list; list = list->prev)
{
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data;
if (! info->cell->visible)
continue;
- real_cell_area.width = info->requested_width +
+ real_background_area.width = info->requested_width +
(info->expand?extra_space:0);
- info->real_width = real_cell_area.width;
- real_background_area.width = real_background_area.width;
+ info->real_width = real_background_area.width;
+
+ real_cell_area.width = real_background_area.width;
+ real_cell_area.width -= 2 * focus_line_width;
+
if (action == CELL_ACTION_RENDER)
{
gtk_cell_renderer_render (info->cell,
&x_offset, &y_offset,
&width, &height);
- if (min_x > (real_cell_area.x + x_offset))
- min_x = real_cell_area.x + x_offset;
- if (max_x < real_cell_area.x + x_offset + width)
- max_x = real_cell_area.x + x_offset + width;
- if (min_y > (real_cell_area.y + y_offset))
- min_y = real_cell_area.y + y_offset;
- if (max_y < real_cell_area.y + y_offset + height)
- max_y = real_cell_area.y + y_offset + height;
+ if (special_cells > 1)
+ {
+ if (info->has_focus)
+ {
+ min_x = real_cell_area.x + x_offset;
+ max_x = min_x + width;
+ min_y = real_cell_area.y + y_offset;
+ max_y = min_y + height;
+ }
+ }
+ else
+ {
+ if (min_x > (real_cell_area.x + x_offset))
+ min_x = real_cell_area.x + x_offset;
+ if (max_x < real_cell_area.x + x_offset + width)
+ max_x = real_cell_area.x + x_offset + width;
+ if (min_y > (real_cell_area.y + y_offset))
+ min_y = real_cell_area.y + y_offset;
+ if (max_y < real_cell_area.y + y_offset + height)
+ max_y = real_cell_area.y + y_offset + height;
+ }
}
- real_cell_area.x += (info->requested_width + tree_column->spacing);
- real_background_area.x += (info->requested_width + tree_column->spacing);
+ else if (action == CELL_ACTION_EVENT)
+ {
+ gboolean try_event = FALSE;
+
+ if (event)
+ {
+ if (special_cells == 1)
+ {
+ /* only 1 activatable cell -> whole column can activate */
+ if (cell_area->x <= ((GdkEventButton *)event)->x &&
+ cell_area->x + cell_area->width > ((GdkEventButton *)event)->x)
+ try_event = TRUE;
+ }
+ else if (real_cell_area.x <= ((GdkEventButton *)event)->x &&
+ real_cell_area.x + real_cell_area.width > ((GdkEventButton *)event)->x)
+ /* only activate cell if the user clicked on an individual
+ * cell
+ */
+ try_event = TRUE;
+ }
+ else if (special_cells > 1 && info->has_focus)
+ try_event = TRUE;
+ else if (special_cells == 1)
+ try_event = TRUE;
+
+ if (try_event)
+ {
+ gboolean visible, mode;
+
+ g_object_get (G_OBJECT (info->cell),
+ "visible", &visible,
+ "mode", &mode,
+ NULL);
+ if (visible && mode == GTK_CELL_RENDERER_MODE_ACTIVATABLE)
+ {
+ if (gtk_cell_renderer_activate (info->cell,
+ event,
+ tree_column->tree_view,
+ path_string,
+ background_area,
+ cell_area,
+ flags))
+ return TRUE;
+ }
+ else if (visible && mode == GTK_CELL_RENDERER_MODE_EDITABLE)
+ {
+ *editable_widget =
+ gtk_cell_renderer_start_editing (info->cell,
+ event,
+ tree_column->tree_view,
+ path_string,
+ background_area,
+ cell_area,
+ flags);
+
+ if (*editable_widget != NULL)
+ {
+ g_return_val_if_fail (GTK_IS_CELL_EDITABLE (*editable_widget), FALSE);
+ info->in_editing_mode = TRUE;
+ gtk_tree_view_column_focus_cell (tree_column, info->cell);
+
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ real_cell_area.x += (info->real_width + tree_column->spacing);
+ real_background_area.x += (info->real_width + tree_column->spacing);
}
+ /* fill focus_rectangle when required */
if (action == CELL_ACTION_FOCUS)
{
if (min_x >= max_x || min_y >= max_y)
path_string);
}
+/* cell list manipulation */
+static GList *
+gtk_tree_view_column_cell_first (GtkTreeViewColumn *tree_column)
+{
+ GList *list = tree_column->cell_list;
+
+ /* first GTK_PACK_START cell we find */
+ for ( ; list; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+ if (info->pack == GTK_PACK_START)
+ return list;
+ }
+
+ /* hmm, else the *last* GTK_PACK_END cell */
+ list = g_list_last (tree_column->cell_list);
+
+ for ( ; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+ if (info->pack == GTK_PACK_END)
+ return list;
+ }
+
+ return NULL;
+}
+
+static GList *
+gtk_tree_view_column_cell_last (GtkTreeViewColumn *tree_column)
+{
+ GList *list = tree_column->cell_list;
+
+ /* *first* GTK_PACK_END cell we find */
+ for ( ; list ; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+ if (info->pack == GTK_PACK_END)
+ return list;
+ }
+
+ /* hmm, else the last GTK_PACK_START cell */
+ list = g_list_last (tree_column->cell_list);
+
+ for ( ; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+ if (info->pack == GTK_PACK_START)
+ return list;
+ }
+
+ return NULL;
+}
+
+static GList *
+gtk_tree_view_column_cell_next (GtkTreeViewColumn *tree_column,
+ GList *current)
+{
+ GList *list;
+ GtkTreeViewColumnCellInfo *info = current->data;
+
+ if (info->pack == GTK_PACK_START)
+ {
+ for (list = current->next; list; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_START)
+ return list;
+ }
+
+ /* out of GTK_PACK_START cells, get *last* GTK_PACK_END one */
+ list = g_list_last (tree_column->cell_list);
+ for (; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_END)
+ return list;
+ }
+ }
+
+ for (list = current->prev; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_END)
+ return list;
+ }
+
+ return NULL;
+}
+
+static GList *
+gtk_tree_view_column_cell_prev (GtkTreeViewColumn *tree_column,
+ GList *current)
+{
+ GList *list;
+ GtkTreeViewColumnCellInfo *info = current->data;
+
+ if (info->pack == GTK_PACK_END)
+ {
+ for (list = current->next; list; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_END)
+ return list;
+ }
+
+ /* out of GTK_PACK_END, get last GTK_PACK_START one */
+ list = g_list_last (tree_column->cell_list);
+ for ( ; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_START)
+ return list;
+ }
+ }
+
+ for (list = current->prev; list; list = list->prev)
+ {
+ GtkTreeViewColumnCellInfo *inf = list->data;
+ if (inf->pack == GTK_PACK_START)
+ return list;
+ }
+
+ return NULL;
+}
gboolean
_gtk_tree_view_column_cell_focus (GtkTreeViewColumn *tree_column,
- gint direction)
+ gint direction,
+ gboolean left,
+ gboolean right)
{
- /* FIXME 73676: allow focusing individual cells */
+ gint count;
+
+ count = _gtk_tree_view_column_count_special_cells (tree_column);
+
+ /* if we are the current focus column and have multiple editable cells,
+ * try to select the next one, else move the focus to the next column
+ */
if (GTK_TREE_VIEW (tree_column->tree_view)->priv->focus_column == tree_column)
- return FALSE;
+ {
+ if (count > 1)
+ {
+ GList *next, *prev;
+ GList *list = tree_column->cell_list;
+ GtkTreeViewColumnCellInfo *info = NULL;
+
+ /* find current focussed cell */
+ for ( ; list; list = list->next)
+ {
+ info = list->data;
+ if (info->has_focus)
+ break;
+ }
+
+ /* not a focussed cell in the focus column? */
+ if (!list || !info || !info->has_focus)
+ return FALSE;
+
+ next = gtk_tree_view_column_cell_next (tree_column, list);
+ prev = gtk_tree_view_column_cell_prev (tree_column, list);
+
+ info->has_focus = FALSE;
+ if (direction > 0 && next)
+ {
+ info = next->data;
+ info->has_focus = TRUE;
+ return TRUE;
+ }
+ else if (direction > 0 && !next && !right)
+ {
+ /* keep focus on latest cell */
+ info = gtk_tree_view_column_cell_last (tree_column)->data;
+ info->has_focus = TRUE;
+ return TRUE;
+ }
+ else if (direction < 0 && prev)
+ {
+ info = prev->data;
+ info->has_focus = TRUE;
+ return TRUE;
+ }
+ else if (direction < 0 && !prev && !left)
+ {
+ /* keep focus on first cell */
+ info = gtk_tree_view_column_cell_first (tree_column)->data;
+ info->has_focus = TRUE;
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+ /* we get focus, if we have multiple editable cells, give the correct one
+ * focus
+ */
+ if (count > 1)
+ {
+ GList *list = tree_column->cell_list;
+
+ /* clear focus first */
+ for ( ; list ; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+ if (info->has_focus)
+ info->has_focus = FALSE;
+ }
+
+ if (direction > 0)
+ ((GtkTreeViewColumnCellInfo *)gtk_tree_view_column_cell_first (tree_column)->data)->has_focus = TRUE;
+ else if (direction < 0)
+ ((GtkTreeViewColumnCellInfo *)gtk_tree_view_column_cell_last (tree_column)->data)->has_focus = TRUE;
+ }
return TRUE;
}
{
GList *list;
+ g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
+
for (list = tree_column->cell_list; list; list = list->next)
{
GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data;
return FALSE;
}
+/**
+ * gtk_tree_view_column_focus_cell:
+ * @tree_view: A #GtkTreeView
+ * @cell: A #GtkCellRenderer
+ *
+ * Sets the current keyboard focus to be at @cell, if the column contains
+ * 2 or more editable and activatable cells.
+ **/
+void
+gtk_tree_view_column_focus_cell (GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell)
+{
+ GList *list;
+ gboolean found_cell = FALSE;
+
+ g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
+ g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
+
+ if (_gtk_tree_view_column_count_special_cells (tree_column) < 2)
+ return;
+
+ for (list = tree_column->cell_list; list; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+
+ if (info->cell == cell)
+ {
+ info->has_focus = TRUE;
+ found_cell = TRUE;
+ break;
+ }
+ }
+
+ if (found_cell)
+ {
+ for (list = tree_column->cell_list; list; list = list->next)
+ {
+ GtkTreeViewColumnCellInfo *info = list->data;
+
+ if (info->cell != cell)
+ info->has_focus = FALSE;
+ }
+
+ /* FIXME: redraw? */
+ }
+}
+
void
_gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn *tree_column,
gboolean install_handler)
void
_gtk_tree_view_column_stop_editing (GtkTreeViewColumn *tree_column)
{
+ GList *list;
+
g_return_if_fail (tree_column->editable_widget != NULL);
tree_column->editable_widget = NULL;
+ for (list = tree_column->cell_list; list; list = list->next)
+ ((GtkTreeViewColumnCellInfo *)list->data)->in_editing_mode = FALSE;
}
void
if (left)
{
*left = 0;
+ list = gtk_tree_view_column_cell_first (column);
- for (list = column->cell_list; list; list = list->next)
+ for (; list; list = gtk_tree_view_column_cell_next (column, list))
{
GtkTreeViewColumnCellInfo *info =
(GtkTreeViewColumnCellInfo *)list->data;
if (right)
{
+ GList *next;
+
*right = 0;
+ list = gtk_tree_view_column_cell_first (column);
- for (list = column->cell_list; list; list = list->next)
+ for (; list; list = gtk_tree_view_column_cell_next (column, list))
{
GtkTreeViewColumnCellInfo *info =
(GtkTreeViewColumnCellInfo *)list->data;
}
/* skip cell */
- if (list && list->next)
+ next = gtk_tree_view_column_cell_next (column, list);
+ if (list && next)
{
- list = list->next;
- for ( ; list; list = list->next)
+ list = next;
+ for ( ; list; list = gtk_tree_view_column_cell_next (column, list))
{
GtkTreeViewColumnCellInfo *info =
(GtkTreeViewColumnCellInfo *)list->data;
gint *width,
gint *height);
gboolean gtk_tree_view_column_cell_is_visible (GtkTreeViewColumn *tree_column);
+void gtk_tree_view_column_focus_cell (GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell);
#ifdef __cplusplus
}
enum {
STRING_COLUMN,
IS_EDITABLE_COLUMN,
+ PIXBUF_COLUMN,
NUM_COLUMNS
};
static GtkTreeModel *
create_model (void)
{
- GtkListStore *model;
+ GtkTreeStore *model;
GtkTreeIter iter;
gint i;
+ GdkPixbuf *foo;
+ GtkWidget *blah;
+
+ blah = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ foo = gtk_widget_render_icon (blah, GTK_STOCK_NEW, GTK_ICON_SIZE_MENU, NULL);
+ gtk_widget_destroy (blah);
- model = gtk_list_store_new (NUM_COLUMNS,
+ model = gtk_tree_store_new (NUM_COLUMNS,
G_TYPE_STRING,
- G_TYPE_BOOLEAN);
+ G_TYPE_BOOLEAN,
+ GDK_TYPE_PIXBUF);
for (i = 0; model_strings[i].string != NULL; i++)
{
- gtk_list_store_append (model, &iter);
+ gtk_tree_store_append (model, &iter, NULL);
- gtk_list_store_set (model, &iter,
+ gtk_tree_store_set (model, &iter,
STRING_COLUMN, model_strings[i].string,
IS_EDITABLE_COLUMN, model_strings[i].is_editable,
+ PIXBUF_COLUMN, foo,
-1);
}
gtk_tree_model_get (model, &iter, IS_EDITABLE_COLUMN, &value, -1);
value = !value;
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, IS_EDITABLE_COLUMN, value, -1);
+ gtk_tree_store_set (GTK_TREE_STORE (model), &iter, IS_EDITABLE_COLUMN, value, -1);
gtk_tree_path_free (path);
}
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
gtk_tree_model_get_iter (model, &iter, path);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, STRING_COLUMN, new_text, -1);
+ gtk_tree_store_set (GTK_TREE_STORE (model), &iter, STRING_COLUMN, new_text, -1);
gtk_tree_path_free (path);
}
GtkWidget *tree_view;
GtkTreeModel *tree_model;
GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
gtk_init (&argc, &argv);
tree_view = gtk_tree_view_new_with_model (tree_model);
g_signal_connect (tree_view, "button_press_event", G_CALLBACK (button_press_event), NULL);
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), TRUE);
- renderer = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
- -1, "String",
- renderer,
- "text", STRING_COLUMN,
- "editable", IS_EDITABLE_COLUMN,
- NULL);
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_column_set_title (column, "String");
+
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer,
+ "pixbuf", PIXBUF_COLUMN, NULL);
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer,
+ "text", STRING_COLUMN,
+ "editable", IS_EDITABLE_COLUMN,
+ NULL);
+ g_signal_connect (G_OBJECT (renderer), "edited",
+ G_CALLBACK (edited), tree_model);
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer,
+ "text", STRING_COLUMN,
+ "editable", IS_EDITABLE_COLUMN,
+ NULL);
g_signal_connect (G_OBJECT (renderer), "edited",
G_CALLBACK (edited), tree_model);
+
+ renderer = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_column_pack_start (column, renderer, TRUE);
+ gtk_tree_view_column_set_attributes (column, renderer,
+ "pixbuf", PIXBUF_COLUMN, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
+
renderer = gtk_cell_renderer_toggle_new ();
g_signal_connect (G_OBJECT (renderer), "toggled",
G_CALLBACK (toggled), tree_model);
gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
gtk_window_set_default_size (GTK_WINDOW (window),
- 650, 400);
+ 800, 175);
gtk_widget_show_all (window);
gtk_main ();